#ifndef CONFIG_FILE_H
#define CONFIG_FILE_H

#pragma warning(disable:4251)

#include "Objects.h"
#include "Vector.h"
#include "Material.h"
#include <string>
#include <map>
#include <vector>
#include <boost/algorithm/string.hpp>


/**
 * Attribut d'un fichier de configuration
 */
class OBJECT_API ConfigFileAttrib{
 public:
    /**
     * crée un attribut vide
     */
    ConfigFileAttrib(){};
    /**
     * assigne une valeur à l'attribut
     * @param s la valeur
     */
    void operator=(std::string s) {m_string=m_clean=s;
                                   boost::erase_all(m_clean," ");};
    /**
     * @return une représentation vectorielle du champ
     */
    Math::Vector				asVector();
    /**
     * @return le champ en clair
     */
    std::string					asString();
    /**
     * @return une représentation en float du champ
     */
    float 						asFloat();
    /**
     * @return une représentation en nombre entier du champ
     */
    int 						asInt();
    /**
     * @return un vecteur des champs séparés par une virgule
     */
    std::vector<std::string> 	asStringVector();
    /**
     * @return un Material selon les informations du champ
     */
    Material					asMaterial();
 private:
    std::string m_string; ///< la chaine naturelle
    std::string m_clean; ///< la chaine sans espaces
};

/**
 * Section d'un fichier de configuration
 */
class OBJECT_API ConfigFileSection{
 public:
    /**
     * Crée une section vide
     */
    ConfigFileSection(){};
    /**
     * accède à un attribut de la section
     * @param s le nom de l'attribut
     * @return l'attribut
     */
    ConfigFileAttrib& operator()(std::string s){return m_attribs[s];}
 private:
    std::map<std::string,ConfigFileAttrib> m_attribs; ///< Map des attributs
};

/**
 * Fichier de configuration .ini
 */
class OBJECT_API ConfigFile{
 public:
    /**
     * Charge un fichier de configuration
     * @param path le chemin d'acces relatif ou absolu
     */
    ConfigFile(std::string path);
    /**
     * retrouve une section du fichier
     * @param s le nom de la section
     * @return la section
     */
    ConfigFileSection& operator()(std::string s){return m_data[s];}
 private:
    std::map<std::string,ConfigFileSection> m_data; ///< Map des sections
};

#endif